在JS中, 所有的轉型與連結都是無感的
也因為太方便太無感 常常會跑出意外的結果
例如
console.log(+"1" + "1")
// 輸出 "11"
console.log(+"1" + 1 )
// 輸出 "2"
console.log("1" + 1 )
// 輸出 "11"
console.log("1" + 1 + 1)
// 輸出 "111"
console.log("1" + (1 + 1))
// 輸出 "12"
這種彈性在撰寫的時候很方便也很快速
但在程式運作上相對是不穩定的
swift 與 kotlin 都是強行別語言
而swift在嚴謹度上高了一點
let house = "這個房子 高度"
let height = 200
let level = 2.0
// print(house + height) // 編譯錯誤 字串與數字不能直接串接
print(house + String(height))// 數字轉型字串 後可作文字串接
// 輸出: 這個房子 高度200
print(house + String(level))// 數字轉型字串 可完整轉型過去 不會移除小數點
// 輸出: 這個房子 高度2.0
// print(house + String(height * level))// 編譯錯誤 Int 與 Double 不能直接計算
print(house + String( Double(height) * level ) )
// 輸出: 這個房子 高度400.0
print("這個房子 高度\(height)")// 或者利用字串插值也是個好方法
// 輸出: 這個房子 高度200
let numInt: Int = 1
let numDouble: Double = 1.9999 // Double 64bit
let numFloat: Float = 1.9999 // Float 32bit
//print(numInt*numFloat) // 編譯錯誤 不同型別的計算被禁止
//print(numInt+numDouble) // 編譯錯誤 不同型別的計算被禁止
print(numInt*Int(numDouble)) // 輸出: 1 , 因為轉型過程中 精確度丟失 numDouble =1
print(numInt*Int(numFloat)) // 輸出: 1 , 轉型過程中 精確度丟失 numFloat =1
print(Int(1.999)) // 輸出: 1 ,小數點後直接丟失
print(Int(1.9999999999999999)) //2 轉型Int Double 9到小數點後16位會變成2
print(Double(numFloat)) // 1.999899983406067 精確度丟失
print(Float(numDouble)) // 1.9999
swift禁止不同型別間的計算
而轉型過程中也會造成精確丟失
依照之前的開發習慣
會盡量避免轉型運算這件事情
一開始寫程式的時候 設計好型別是很重要的
fun main() {
val house = "這個房子 高度"
val height = 200
val level = 2.0
println(house + height) // 這個房子 高度200 同JAVA 當字串處理
println(house + level.toString())// 數字轉型字串 可完整轉型過去 不會移除小數點
// 這個房子 高度2.0
println(house + height * level)// Int 與 Double 可以直接計算
// 這個房子 高度400.0
println("這個房子 ${height}")// 或者利用字串插值也是個好方法
// 這個房子 高度200
val numInt: Int = 1
val numDouble: Double = 1.9999 // Double 64bit
val numFloat: Float = 1.9999F // Float 32bit
println(numInt*numFloat) // 1.9999 可正確計算 雖然沒看到F, 但實際上是Float
println((numInt*numFloat).javaClass.kotlin.simpleName ) // 輸出: Float
println(numInt+numDouble) // 2.9999000000000002 轉型計算後會產生偏差
println((numInt+numDouble).javaClass.kotlin.simpleName) // 輸出: Double
println(1.999.toInt()) // 1 小數點後直接丟失
println(1.9999999999999999.toInt()) //2 轉型Int Double 9到小數點後16位會變成2
println(1.9999F.toDouble()) // 1.999899983406067 精確度丟失
println(1.9999.toFloat()) // 1.9999
}
整體寫起來較方便
但同時帶來的是可能讓你忽略精準度遺失問題
這其實偏開發習慣了
是要開發時方便順手
還是之後程式可讀性與可維護性比較高
到目前為止 轉型算是兩種語言間
差異較大的部分
此系列想探討 開發差異與工程師可否同時開發這兩種語言
到目前為止 語法差異只要瞭解 問題就不大
如果同時開發兩種語言
個人偏向用同樣嚴謹的心態。
去撰寫kotlin & Swift 就可以拉~
畢竟身為Web開發者
踩過的各種型別的坑 多到數不清啊(淚
嚴謹~小心一點準沒錯
啊拉~阿拉~
對現在的阿咪來說....
不斷看資料 文件 練習
很刻苦啊~
好想快點把開發工具打開來浪一浪
但現在只能暫時不斷啃書啊~~~~
好想快點脫離基礎
目前預計遊戲想來做個小雞遊戲
下午抽個空 來亂畫幾隻雞
過幾天我們一起聞雞起舞吧~~~~~~~~
ε=(;;:;::;)=3(好香好香~